import axios from 'axios';
import {message as Massage} from 'antd'
import {UserResetAction} from '../actions/user'
import { store } from '../store'

console.log(process.env.REACT_APP_BASE_URL)
const service = axios.create({
  baseURL: process.env.REACT_APP_BASE_URL,
  timeout: 5000,
})

// 定义存放已发送但未响应的请求
const requestMap = new Map();
// 获取请求的唯一标识
const getRequestIdentify = (config, isReuest = false) => config.url
// 请求拦截
service.interceptors.request.use(function(config) {
  let requestData  = getRequestIdentify(config, true)
  if (requestMap.has(requestData)) {
    // map中存在该请求，不再重复发起
    return Promise.reject(new Error('重复请求'))
  } else if (!config.canReapeat) {
    // 通过在请求中设置 canReapeat 参数，允许特殊接口的重复提交, 若map中没有该请求，则将请求存入map，并发起请求
    requestMap.set(requestData, true)
  }

  const token = store.getState().user.tokenHead +  store.getState().user.token
  config.headers['Authorization'] = token
  return config
})

// 响应拦截
service.interceptors.response.use(function(response) {
  const requestData = getRequestIdentify(response.config);
  // 请求获得响应后，将该请求从map中移除，以使后面的请求正常发送。
  if (requestMap.has(requestData)) {
    requestMap.delete(requestData)
  }

  if (response.status >= 200 && response.status <= 300) {
    let { message, data, code} = response.data

    if (code === 401) {
      Massage.info(message)
      store.dispatch(UserResetAction())
    }

    if (code === 200) { // 成功data数据
      return response.data
    }
    Massage.info(message)
  }

}, function(error) {
  return Promise.reject(error);
})

export default service
